#include "../../include/driver/driver_usart.h"
#include "../../include/device/rtkDevice.h"

C_rtkDevice::C_rtkDevice(const char *_path, int _speed)
{
    spdlog::info("C_rtkDevice init {} {} ", _path, _speed);
    m_rtKserial = NULL;
    switch (_speed)  {
    case 115200:
        m_rtKserial = new SerialDriver(_path, BPS115200); // 串口驱动对象，包含了对串口的初始化
        break;
    default:
        spdlog::error("error! C_rtkDevice:: SerialDriver band input wrong");
        break;
    }
    m_recvBuf = (uint8_t*)malloc(512*(sizeof(uint8_t)));
}

C_rtkDevice::~C_rtkDevice()
{
}

void C_rtkDevice::sandUsartData(uint8_t *buf, uint32_t bufLen)
{
    spdlog::info("sandUsartData:");
    for(int i=0; i<bufLen; i++){
        printf("%c",buf[i]);
    }
    printf("\r\n");
    m_rtKserial->Write(buf, bufLen);
}


int32_t C_rtkDevice::recvUsartData(std::vector<uint8_t> &gnss_buffer)
{
    std::vector<uint8_t> data_buffer;
    std::vector<uint8_t> tempBuf;
    int32_t tempHeadData = 0;
    int32_t tempFindHeadFlag = 0;

    int32_t read_result = m_rtKserial->ReadBytes(data_buffer, 0, 100);
    
    if(read_result == RECV_DONE){
        m_rtkUsartBuffer.insert(m_rtkUsartBuffer.end(), data_buffer.begin(), data_buffer.end());
    }
    /*数据帧寻找方法：
    程序开始有空的固定数据缓冲器buf，如果有接收到数据就将数据储插入到固定的缓冲区buf的最后面的位置。
    到数据帧头和帧尾的位置，将完整的数据帧保存到函数输出缓冲器中，作为函数的本次输出结果。 
    将这次找到的数据帧尾到结束的位置到这一次接收的数据的最后位置的这些剩余所有数据都转存到临时buf中，
    再将固定缓冲区中的buf内容替换成临时buf的内容，等待下一次数据*/ 
    if(m_rtkUsartBuffer.size()>0){
        //printf("read_result:%d\n", read_result);
        for (int i=0; i < m_rtkUsartBuffer.size(); i++){
            if(m_rtkUsartBuffer[i] == 0x24){ // 寻找到了包头 $
                tempHeadData = i;
                tempFindHeadFlag = 1;
                break;
            }
        }
        if(tempFindHeadFlag == 0)  return REV_NULL; // 如果在缓存区内没有找到包头，直接进入下一次数据接收等待
        for (int j = tempHeadData; j < m_rtkUsartBuffer.size(); j++){ // 开始寻找包尾 0x0A
            tempBuf.insert(tempBuf.end(), m_rtkUsartBuffer[j]); // 把数据填进buf内
            if(m_rtkUsartBuffer[j] == 0x0A){ // 检测到了包尾
                gnss_buffer = tempBuf;
                std::vector<uint8_t> reamin_buffer; // 存放剩余数据
                reamin_buffer.insert(reamin_buffer.end(), m_rtkUsartBuffer.begin()+j, m_rtkUsartBuffer.end()); //转存剩余的数据
                m_rtkUsartBuffer = reamin_buffer; // 更新储存内存
                return RECV_DONE;
                break;
            }
        }
    }
    return REV_NULL;
}
